import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { user } from '@prisma/client';
import { Observable } from 'rxjs';
import { Role } from '../enum';

@Injectable()
export class RoleGuard implements CanActivate {
  constructor(private reflector: Reflector) {}
  canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
    // 这里可以获取到用户的数据 因为这个数据通过 JwtStrategy类压入到了Http对象中
    const user = context.switchToHttp().getRequest().user as user;
    // console.log(user);

    // 这里获取到设置的权限 也就是在 Auth控制器中已经在SetMetadata存储过的roles数据
    const roles = this.reflector.getAllAndMerge<Role[]>('roles', [context.getHandler(), context.getClass()]);
    // 如果有角色权限 并且角色权限中包含用户角色 放行
    return roles.length ? roles.some((role) => user.role == role) : true;
  }
}
